<script setup>
import { onMounted, ref } from 'vue'
import axios from 'axios'
import js from '@eslint/js';
import bwPowerSet from '@/components/power-set.js'
// 商品数据
const goods = ref({})
let pathMap = {}
const getGoods = async () => {
  // 1135076  初始化就有无库存的规格
  // 1369155859933827074 更新之后有无库存项（蓝色-20cm-中国）
  const res = await axios.get('http://pcapi-xiaotuxian-front-devtest.itheima.net/goods?id=1369155859933827074')
  goods.value = res.data.result

  const pathMap = getPathMap(goods.value)
  console.log(pathMap)

}
onMounted(() => getGoods())

const changeSelectedStatus = (item,val) => {


  if(val.disabled) return
  //item 同一排对象
  //var 当前值
  if(val.selected){
    val.selected = false
  } else{
    // 当前元素没有激活
    item.values.forEach(i => i.selected = false)
    val.selected = true
  }
    updateDisabledStatus(goods.value.specs,pathMap)
}

// 生成有效的路径字典对象
const getPathMap = (goods) => {
  const pathMap = {}
//1 根据skus字段生成有效的sku数组
const effectiveSkus = goods.skus.filter(sku => sku.inventory > 0)
//2.根据有效的sku使用sku算法(子集算法)【1，2】 - 【【1】 【2】 【1，2】】
effectiveSkus.forEach(
  sku => {
    //2.1 获取匹配valueName组成的数组
    const selectedValArr = sku.specs.map(val => val.valueName)
    console.log(selectedValArr)
    // 使用算法获取子集
    const valueArrePowerSet = bwPowerSet(selectedValArr)
    // 将子集生成到最终的路径字典里面
    valueArrePowerSet.forEach(set => {
      const key = set.join('-')
      // 如果没有就先初始化一个空数组
      if (pathMap[key]) {
        pathMap[key].push(sku.id)
      } else{
        pathMap[key] = [sku.id]
      }
    })
  }
)
  return pathMap
}


// 获取选中项的匹配数组
const getSelectedValues = (specs) => {
  const arr = []
  specs.forEach(item => {
    // 目标 找到values中selected为true的项 然后把他的name字段添加数组对应的位置
    const selectedVal = specs.values.find(item => item.selected)
    arr.push(selectedVal? selectedVal.name:undefined)
  })
  return arr
}

// 切换时更新禁用状态
const updateDisabledStatus = (specs,pathMap) => {
  specs.forEach((spec , index)=> {
    const selectedValues = getSelectedValues()
    spec.values.forEach(val=> {
      selectedValues[index] = val.name
      const key = selectedValues.filter(value=>value).join("-")
      if(pathMap[key]){
        val.disabled = false
      } else {
        val.disabled = true
      }
    })
  })
}


</script>

<template>
  <div class="goods-sku">
    <dl v-for="item in goods.specs" :key="item.id">
      <dt>{{ item.name }}</dt>
      <dd>
        <template v-for="val in item.values" :key="val.name">
          <!-- 图片类型规格 -->
          <img v-if="val.picture" :src="val.picture" :title="val.name">
          <!-- 文字类型规格 -->
          <span v-else :class="{selected: val.selected }" @click="changeSelectedStatus(item,val)">{{ val.name }}</span>
        </template>
      </dd>
    </dl>
  </div>
</template>

<style scoped lang="scss">
@mixin sku-state-mixin {
  border: 1px solid #e4e4e4;
  margin-right: 10px;
  cursor: pointer;

  &.selected {
    border-color: #27ba9b;
  }

  &.disabled {
    opacity: 0.6;
    border-style: dashed;
    cursor: not-allowed;
  }
}

.goods-sku {
  padding-left: 10px;
  padding-top: 20px;

  dl {
    display: flex;
    padding-bottom: 20px;
    align-items: center;

    dt {
      width: 50px;
      color: #999;
    }

    dd {
      flex: 1;
      color: #666;

      >img {
        width: 50px;
        height: 50px;
        margin-bottom: 4px;
        @include sku-state-mixin;
      }

      >span {
        display: inline-block;
        height: 30px;
        line-height: 28px;
        padding: 0 20px;
        margin-bottom: 4px;
        @include sku-state-mixin;
      }
    }
  }
}
</style>
